#include <iostream>


//
// Clases
//

class cTest {
	int m_x;

public:
	cTest(int x=0) {m_x = x;}
	~cTest() {}
	void SetX(int x) {m_x = x;}
	int GetX(void) const {return m_x;}
};


//
// Funciones Auxiliares
//

// Funcion que devuelve el valor de m_x en la clase cTest, lo muestra en pantalla y luego lo duplica
// Por supuesto como el argumento es const, si descomentamos  la llamada t.SetX(t.GetX()*2) la funcion se quejara
const int& PrintValue(const cTest& t) {
	
	// Como la referencia va a utilizar de almacenamiento el lugar de memoria del objeto t
	// entonces la referencia debe ser const, pq el objeto es const, es decir, no podemos modificar 
	// la referencia pq estariamos modificando el objeto :D
	const int& x = t.GetX();
	std::cout << "El Valor es: " << x << std::endl;

	//t.SetX(t.GetX()*2);
	return x;
}


//
// Main
//	

int main(void) {

	// El Objeto pasado como argumento es const, luego la referencia algun campo (en este caso un int) debe ser
	// const
	const cTest test(7);

	const int& res = PrintValue(test);

	// Si descomentaramos la linea siguiente nos daria error pq estariamos incrementando el lugar de memoria
	// del objeto const, pq res es una referencia
	//res++;

	return 0;
}
